package com.rongx.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.rongx.reggie.common.R;
import com.rongx.reggie.entity.User;
import com.rongx.reggie.service.UserService;
import com.rongx.reggie.utils.ValidateCodeUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@RestController
@Slf4j
@RequestMapping("/user")
@SuppressWarnings("all")
@RequiredArgsConstructor

public class UserController {
    private final UserService userService;

    // 固定Session键名：统一存储登录验证码
    private static final String LOGIN_CODE_KEY = "LOGIN_CODE";



    /**
     * 发送手机短信验证码
     */
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session) {
        // 1. 获取并校验手机号（去空格，避免前端传递空格导致匹配失败）
        try {
            String phone = user.getPhone() == null ? "" : user.getPhone().trim();
            if (StringUtils.isEmpty(phone)) {
                log.warn("发送验证码失败：手机号为空");
                return R.error("手机号不能为空");
            }

            // 2. 生成4位随机验证码 测试时使用
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("生成登录验证码：phone={}, code={}", phone, code);

            // 3. 封装手机号+验证码到Map，存入Session（固定键名，避免键不匹配）
            Map<String, String> codeMap = new HashMap<>();
            codeMap.put("phone", phone);    // 存储去空格后的手机号
            codeMap.put("code", code);      // 存储验证码
            session.setAttribute(LOGIN_CODE_KEY, codeMap);
            log.info("Session已存储验证码：SessionID={}, codeMap={}", session.getId(), codeMap);

            // 4. 调用阿里云短信API（实际项目解开注释，测试时跳过）
            // SMSUtils.sendMessage("瑞吉外卖", "你的短信模板ID", phone, code);


        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return R.success("验证码已发送（测试模式，验证码已打印到控制台）");
    }

    /**
     * 移动端用户登录（修正核心问题）
     */
    @PostMapping("/login")
    public R<User> login(@RequestBody Map<String,String> map) {
        // 1. 打印前端请求参数，方便排查参数传递问题
        log.info("登录请求参数：{}", map);

        // 2. 从map中获取并校验phone和code（关键修正：之前未定义这两个变量）
        // 2.1 处理phone：去空格，避免与Session中存储的手机号不一致
        String phone = map.get("phone") == null ? "" : map.get("phone").trim();
        // 2.2 处理code：去空格，避免输入空格导致验证码不匹配
        String code = map.get("code") == null ? "" : map.get("code").trim();

        // 2.3 非空校验
        if (StringUtils.isEmpty(phone)) {
            log.warn("登录失败：手机号为空");
            return R.error("请输入手机号");
        }
        if (StringUtils.isEmpty(code)) {
            log.warn("登录失败：验证码为空，phone={}", phone);
            return R.error("请输入验证码");
        }

        // 3. 获取当前请求的Session（修正：增加空判断，避免RequestContextHolder获取不到属性）
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (requestAttributes == null) {
            log.error("登录失败：无法获取请求上下文（可能是非HTTP请求）");
            return R.error("登录异常，请刷新页面重试");
        }
        HttpSession session = requestAttributes.getRequest().getSession();
        log.info("当前登录请求的SessionID：{}", session.getId());

        // 4. 从Session中获取验证码Map（核心逻辑）
        Map<String, String> codeMap = (Map<String, String>) session.getAttribute(LOGIN_CODE_KEY);
        if (codeMap == null) {
            log.warn("登录失败：Session中无验证码，可能已过期或未发送，phone={}", phone);
            return R.error("验证码已过期，请重新获取");
        }

        // 5. 双重校验：手机号一致 + 验证码一致（修正：确保Session中的数据非空）
        String sessionPhone = codeMap.getOrDefault("phone", ""); // 避免键不存在导致null
        String sessionCode = codeMap.getOrDefault("code", "");   // 避免键不存在导致null

        // 5.1 校验手机号：确保当前登录手机号与获取验证码的手机号一致
        if (!phone.equals(sessionPhone)) {
            log.warn("登录失败：手机号不匹配，当前phone={}, Session中phone={}", phone, sessionPhone);
            return R.error("当前手机号未获取验证码，请重新发送");
        }
        // 5.2 校验验证码
        if (!code.equals(sessionCode)) {
            log.warn("登录失败：验证码错误，输入code={}, Session中code={}", code, sessionCode);
            return R.error("验证码错误，请重新输入");
        }

        // 6. 验证码通过，查询/注册用户
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getPhone, phone); // 用去空格后的手机号查询
        User user = userService.getOne(queryWrapper);

        // 6.1 新用户自动注册（手机号未存在于数据库）
        if (user == null) {
            user = new User();
            user.setPhone(phone);
            user.setStatus(1); // 1：账号正常状态
            userService.save(user);
            log.info("新用户自动注册成功：phone={}, userId={}", phone, user.getId());
        }

        // 7. 登录成功：清除Session中的验证码（避免重复使用），存入用户ID
        session.removeAttribute(LOGIN_CODE_KEY); // 关键：验证码一次性使用
        session.setAttribute("user", user.getId()); // 用于后续登录状态校验
        log.info("用户登录成功：userId={}, phone={}, SessionID={}", user.getId(), phone, session.getId());

        return R.success(user);
    }
}